/*
* Copyright (C) 2009-2017 Slava Semushin <slava.semushin@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package ru.mystamps.web.tests.cases;
import java.util.List;
import ru.mystamps.web.tests.page.AbstractPageWithForm;
import ru.mystamps.web.tests.page.element.Form.Field;
import ru.mystamps.web.tests.page.element.Form.SubmitButton;
import static ru.mystamps.web.tests.TranslationUtils.tr;
import static org.fest.assertions.api.Assertions.assertThat;
@SuppressWarnings("checkstyle:abstractclassname")
abstract class WhenAnyUserAtAnyPageWithForm<T extends AbstractPageWithForm>
extends WhenAnyUserAtAnyPage<T> {
WhenAnyUserAtAnyPageWithForm(Class<T> pageClass) {
super(pageClass);
}
protected void checkStandardStructure() {
shouldHaveForm();
shouldHaveFields();
shouldHaveLabels();
shouldHaveSubmitButton();
requiredFieldsShouldBeMarkedByAsterisk();
mayExistsLegendAboutRequiredFields();
emptyValueShouldBeForbiddenForRequiredFields();
fieldsValuesShouldBePreservedWhenErrorOccurs();
}
private void shouldHaveForm() {
assertThat(page.formExists())
.overridingErrorMessage("form tag should exists")
.isTrue();
}
private void shouldHaveFields() {
for (Field field : page.getForm().getFields()) {
if (field.isAccessibleByAll()) {
assertThat(page.isFieldExists(field))
.overridingErrorMessage("field with XPath '" + field + "' should exists")
.isTrue();
}
}
}
private void shouldHaveLabels() {
for (Field field : page.getForm().getFields()) {
if (!field.isAccessibleByAll() || !field.hasLabel()) {
continue;
}
String msg = String.format(
"field with id '%s' should have label '%s'",
field.getId(),
field.getLabel()
);
assertThat(page.getInputLabelValue(field.getId()))
.overridingErrorMessage(msg)
.isEqualTo(field.getLabel());
}
}
private void shouldHaveSubmitButton() {
for (SubmitButton button : page.getForm().getSubmitButtons()) {
assertThat(page.isSubmitButtonExists(button))
.overridingErrorMessage(
String.format(
"submit button with value '%s' should exists", button.getValue()
)
)
.isTrue();
}
}
private void requiredFieldsShouldBeMarkedByAsterisk() {
for (Field field : page.getForm().getRequiredFields()) {
assertThat(page.inputHasAsterisk(field.getId()))
.overridingErrorMessage(
String.format(
"required field with id '%s' should be marked by asterisk", field.getId()
)
)
.isTrue();
}
}
private void mayExistsLegendAboutRequiredFields() {
if (page.getForm().getRequiredFields().isEmpty()) {
return;
}
assertThat(page.getFormHints())
.overridingErrorMessage("legend about required fields should exists")
.contains(tr("t_required_fields_legend", "*"));
}
protected void emptyValueShouldBeForbiddenForRequiredFields() {
List<Field> requiredFields = page.getForm().getRequiredFields();
if (requiredFields.isEmpty()) {
return;
}
page.submit();
for (Field field : requiredFields) {
assertThat(page.getFieldError(field.getId()))
.overridingErrorMessage(
String.format(
"required field with id '%s' should not accept empty value", field.getId()
)
)
.isEqualTo(tr("org.hibernate.validator.constraints.NotEmpty.message"));
}
}
private void fieldsValuesShouldBePreservedWhenErrorOccurs() {
for (Field field : page.getForm().getFields()) {
if (!field.hasInvalidValue()) {
System.err.println(
"NOTICE: Invalid value not defined for field '"
+ field.getName()
+ "' at page "
+ page.getUrl()
);
continue;
}
page.fillField(field.getName(), field.getInvalidValue());
page.submit();
if (field.shouldPreserveInvalidValue()) {
String msg = String.format(
"field named '%s' should preserve input value after error",
field.getName()
);
assertThat(page.getFieldValue(field.getName()))
.overridingErrorMessage(msg)
.isEqualTo(field.getInvalidValue());
} else {
String msg = String.format(
"field named '%s' should not preserve input value after error",
field.getName()
);
assertThat(page.getFieldValue(field.getName()))
.overridingErrorMessage(msg)
.isEmpty();
}
}
}
}